package com.cskaoyan.javse.oop3._2inner._4loacl._1basic;

/**
 * @description: 局部内部类的访问特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 局部内部类的访问特点,需要先明确下面:
 *      局部内部类和外围类仍然是"hxd",所以局部内部类访问外围类成员不受访问权限限制
 *      但是局部内部类的作用范围仅在方法/代码块内部,外围类中能够访问局部内部类的方法仅有装着内部类的方法
 *
 * 局部内部类中访问外围类成员
 *      1.在外围类的成员方法中定义局部内部类
 *          由于已经存在外围类对象,所以可以直接访问
 *          如果出现同名情况
 *              this指向内部类自身对象
 *              外围类类名.this指向外围类对象
 *          而如果全局常量同名,就用类名点区分
 *
 *      2.在外围类的静态成员方法中定义局部内部类
 *          因为静态方法中没有任何对象,所以如果想要访问外围类对象,需要先创建对象(直接创建)
 *          得到对象后用对象名点访问即是外围类成员
 *
 *
 * 外围类中访问局部内部类成员
 *      是有限制的,必须是装着局部内部类的方法才能访问到
 *      必须在方法中创建局部内部类对象,然后访问
 *
 * 外部类访问局部内部类成员
 *      不能,访问不到
 * 局部内部类访问外部类成员
 *      能,但是受访问权限限制,并且要创建对象
 *
 */
public class Demo {
    public static void main(String[] args) {
            EnclosedClazz.testStatic();
        System.out.println("-----------");
            new EnclosedClazz().test();
    }
}
class EnclosedClazz{
    int a = 10;
    private int b = 20;
    static int c = 30;
    static final int D = 40;

    //外围类成员方法
    public void test(){
        //定义局部内部类
        class Inner{
            int a = 100;
            private int b = 200;
            static final int D = 400;
            public void testInner(){
                System.out.println(a);
                System.out.println(EnclosedClazz.this.a);
                System.out.println(b);
                System.out.println(EnclosedClazz.c);
                System.out.println(EnclosedClazz.D);
            }
        }
        Inner inner = new Inner();
        inner.testInner();
        System.out.println(inner.b);
    }
    //外围类静态成员方法
    public static void testStatic(){
        class Inner{
            int a = 100;
            private int b = 200;
            static final int D = 400;
            public void testInner(){
                EnclosedClazz ec = new EnclosedClazz();
                System.out.println(a);
                System.out.println(ec.a);
                System.out.println(ec.b);
            }
        }
        Inner inner = new Inner();
        inner.testInner();
    }



}
